package reflect;

import reflect.annotations.AutoRunClass;
import reflect.annotations.AutoRunMethod;

import java.io.File;
import java.lang.reflect.Method;

/**
 * 自动调用与Test4在同一个包中那些被@AutoRunClass标注的类中所有被@AutoRunMethod标注的方法
 * n次，n对应的是注解@AutoRunMethod传入的参数值
 *
 *
 */
public class Test5 {
    public static void main(String[] args) throws Exception{
        File dir=new File(
                Test5.class.getResource(".").toURI()
        );
        //获取包名
        String packageName=Test5.class.getPackage().getName();
        System.out.println(packageName);


        File [] files=dir.listFiles(f->f.getName().endsWith(".class"));
        for (File file:files){
            //获取类名
            String fileName= file.getName();
            String className=fileName.substring(0,fileName.indexOf("."));

            Class cls=Class.forName(packageName+"."+className);
            if (cls.isAnnotationPresent(AutoRunClass.class)){
                Object o=cls.newInstance();
                Method[]methods=cls.getDeclaredMethods();
                for (Method method:methods){
                    //判断该方法是否被注解@AutoRunMethod标注了
                    if (method.isAnnotationPresent(AutoRunMethod.class)){
                        //通过方法对象获取该注解
                        AutoRunMethod arm=method.getAnnotation(AutoRunMethod.class);
                        int value=arm.value();
                        System.out.println(
                                "方法"+method.getName()+"上的注解AutoRunMethod指定的参数为"+value+"次"
                        );
                        for (int i = 0; i <value; i++) {
                            method.invoke(o);

                        }
                    }
                }
            }
        }
    }
}
